import RPi.GPIO as GPIO
import time

class GPIOController:
    def __init__(self, mode=GPIO.BOARD):
        """
        初始化 GPIO 控制器。
        :param mode: 引脚编号模式，默认为 BOARD 模式（GPIO.BOARD)
        """
        self.mode = mode
        GPIO.setmode(self.mode)
        GPIO.setwarnings(False)  # 禁用警告
        self.pwm_instances = {}  # 存储 PWM 实例

    def setup_pin(self, pin, mode, pull_up_down=GPIO.PUD_OFF):
        """
        设置引脚模式。
        :param pin: 引脚编号。
        :param mode: 引脚模式（GPIO.IN 或 GPIO.OUT）。
        :param pull_up_down: 上拉/下拉电阻（GPIO.PUD_UP, GPIO.PUD_DOWN, GPIO.PUD_OFF）。
        """
        GPIO.setup(pin, mode, pull_up_down=pull_up_down)

    def output_pin(self, pin, state):
        """
        设置引脚输出状态。
        :param pin: 引脚编号。
        :param state: 输出状态（GPIO.HIGH 或 GPIO.LOW）。
        """
        GPIO.output(pin, state)

    def read_pin(self, pin):
        """
        读取引脚输入状态。
        :param pin: 引脚编号。
        :return: 引脚状态（GPIO.HIGH 或 GPIO.LOW）。
        """
        return GPIO.input(pin)

    def create_pwm(self, pin, frequency):
        """
        创建 PWM 实例。
        :param pin: 引脚编号。
        :param frequency: PWM 频率（Hz）。
        """
        if pin in self.pwm_instances:
            raise ValueError(f"PWM already exists on pin {pin}")
        pwm = GPIO.PWM(pin, frequency)
        self.pwm_instances[pin] = pwm

    def start_pwm(self, pin, duty_cycle):
        """
        启动 PWM。
        :param pin: 引脚编号。
        :param duty_cycle: 初始占空比（0.0 到 100.0）。
        """
        if pin not in self.pwm_instances:
            raise ValueError(f"No PWM instance found on pin {pin}")
        self.pwm_instances[pin].start(duty_cycle)

    def change_pwm_frequency(self, pin, frequency):
        """
        改变 PWM 频率。
        :param pin: 引脚编号。
        :param frequency: 新的 PWM 频率（Hz）。
        """
        if pin not in self.pwm_instances:
            raise ValueError(f"No PWM instance found on pin {pin}")
        self.pwm_instances[pin].ChangeFrequency(frequency)

    def change_pwm_duty_cycle(self, pin, duty_cycle):
        """
        改变 PWM 占空比。
        :param pin: 引脚编号。
        :param duty_cycle: 新的占空比（0.0 到 100.0）。
        """
        if pin not in self.pwm_instances:
            raise ValueError(f"No PWM instance found on pin {pin}")
        self.pwm_instances[pin].ChangeDutyCycle(duty_cycle)

    def stop_pwm(self, pin):
        """
        停止 PWM。
        :param pin: 引脚编号。
        """
        if pin not in self.pwm_instances:
            raise ValueError(f"No PWM instance found on pin {pin}")
        self.pwm_instances[pin].stop()
        del self.pwm_instances[pin]

    def add_event_detect(self, pin, edge, callback=None, bouncetime=None):
        """
        添加事件检测。
        :param pin: 引脚编号。
        :param edge: 边缘类型（GPIO.RISING, GPIO.FALLING, GPIO.BOTH）。
        :param callback: 回调函数。
        :param bouncetime: 防抖时间（毫秒）。
        """
        GPIO.add_event_detect(pin, edge, callback=callback, bouncetime=bouncetime)

    def remove_event_detect(self, pin):
        """
        移除事件检测。
        :param pin: 引脚编号。
        """
        GPIO.remove_event_detect(pin)

    def cleanup(self):
        """
        清理 GPIO 设置，释放资源。
        """
        for pin in self.pwm_instances:
            self.pwm_instances[pin].stop()
        self.pwm_instances.clear()
        GPIO.cleanup()

    def __del__(self):
        """
        析构函数，确保资源被释放。
        """
        self.cleanup()